package com.ppm.common.dao;

import java.util.List;

import org.hibernate.LockMode;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Service;


/** 
* @Title: CommonHibernateDAO
* @Description: 通用数据库操作DAO
* @author: taiyuan321@gmail.com 
* @date: 2011-8-12 上午10:46:55
* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
* @version： V1.0
* @copyright：版权申明
*/
@Service
public class CommonHibernateDAO<T> extends HibernateDaoSupport {
	
	/** 
	* @Title: save 
	* @Description: 保存一个新的对象
	* @param: @param obj    
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:44:49
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void save(T obj)
	{
		getHibernateTemplate().save(obj); 
	}
	
	
	/** 
	* @Title: persist 
	* @Description: persist把一个瞬态的实例持久化，
	* 				但是并"不保证"标识符被立刻填入到持久化实例中，
	* 				 标识符的填入可能被推迟到flush的时间。
	* @param: @param obj
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:44:51
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void persist(T obj)
	{
		getHibernateTemplate().persist(obj); 
	}
	
	
	/** 
	* @Title: update 
	* @Description: 更新一个已经持久化的对象
	* @param: @param obj    
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:02
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void update(T obj)
	{
		getHibernateTemplate().update(obj);
	}
	
	
	/** 
	* @Title: saveOrUpdate 
	* @Description: 如果对象已经在本session中持久化了，不做任何事 
	* 				如果另一个与本session关联的对象拥有相同的持久化标识(identifier)，抛出一个异常
	* 				如果对象没有持久化标识(identifier)属性，对其调用save()，
	* 				如果对象的持久标识(identifier)表明其是一个新实例化的对象，对其调用save()
	* 				如果对象是附带版本信息的（通过<version>或<timestamp>） 并且版本属性的值表明其是一个新实例化的对象，save()它
	* 				否则update它	 
	* @param: @param obj    
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:05
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void saveOrUpdate(T obj)
	{
		getHibernateTemplate().saveOrUpdate(obj);
	}
	
	
	/** 
	* @Title: merge 
	* @Description: 如果session中存在相同持久化标识(identifier)的实例，
	* 				用用户给出的对象的状态覆盖旧有的持久实例 
	* 				如果session没有相应的持久实例，则尝试从数据库中加载，
	* 				或创建新的持久化实例,最后返回该持久实例 
	* 				注意merge完之后我们提供的obj仍然是脱管状态

	* @param: @param obj
	* @param: @return    
	* @return: T    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:08
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public T merge(T obj)
	{
		return getHibernateTemplate().merge(obj);
	}
	
	
	/** 
	* @Title: delete 
	* @Description: 删除一个对象
	* @param: @param obj    
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:12
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void delete(T obj)
	{
		getHibernateTemplate().delete(obj);
	}

	
	/** 
	* @Title: findById 
	* @Description: 根据主键去查找对象
	* @param: @param clazz
	* @param: @param id
	* @param: @return    
	* @return: T    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:14
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public <T> T findById(Class<T> clazz, Long id)
	{
		return (T)getHibernateTemplate().get(clazz.getName(), id);
	}

	
	/** 
	* @Title: findByExample 
	* @Description: 根据示例对象的属性去查找
	* @param: @param instance
	* @param: @return    
	* @return: List<T>    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:17
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public List<T> findByExample(T instance)
	{
		return getHibernateTemplate().findByExample(instance);
	}

	
	/** 
	* @Title: findByProperty 
	* @Description: 根据对象的某个属性去查找对象
	* @param: @param clazz
	* @param: @param propertyName
	* @param: @param value
	* @param: @return    
	* @return: List<T>    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:19
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public List<T> findByProperty(Class<T> clazz, String propertyName, T value)
	{
		String queryString = "from "+clazz.getName()+" as model where model." 
				+ propertyName + "= ?";
		return getHibernateTemplate().find(queryString, value);
	}

	
	/** 
	* @Title: findAll 
	* @Description: 查询所有的对象
	* @param: @param clazz
	* @param: @return    
	* @return: List<T>    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:25
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public List<T> findAll(Class<T> clazz)
	{
		String queryString = "from "+clazz.getName();
	 	return getHibernateTemplate().find(queryString);
	}
	
	
	/** 
	* @Title: attachDirty 
	* @Description: 这里用一句话描述这个方法的作用
	* @param: @param instance    
	* @return: void    返回类型 
	* @author: taiyuan321@gmail.com 
	* @date: 2011-8-12 上午10:45:29
	* @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
	* @throws: 
	*/
	public void attachDirty(T instance) {
        try {
            getHibernateTemplate().saveOrUpdate(instance);
        } catch (RuntimeException re) {
            throw re;
        }
    }
    
	
    /** 
    * @Title: attachClean 
    * @Description: 这里用一句话描述这个方法的作用
    * @param: @param instance    
    * @return: void    返回类型 
    * @author: taiyuan321@gmail.com 
    * @date: 2011-8-12 上午10:45:31
    * @track: taiyuan321@gmail.com| 2011-8-12| 修改描述
    * @throws: 
    */
    public void attachClean(T instance) {
        try {
        	getHibernateTemplate().lock(instance, LockMode.NONE);
        } catch (RuntimeException re) {
            throw re;
        }
    }
    
    
}
